package com.he1618.boot3.app;

import weka.classifiers.Evaluation;
import weka.classifiers.functions.Logistic;
import weka.core.Instances;
import weka.core.converters.ConverterUtils.DataSource;

public class WekaExample {

    public static void main(String[] args) {
        try {
            // 加载鸢尾花数据集
            DataSource source = new DataSource("E:\\data\\iris.arff");
            Instances data = source.getDataSet();

            // 设置类别属性
            data.setClassIndex(data.numAttributes() - 1);

            // 创建逻辑回归分类器
            Logistic logistic = new Logistic();

            // 训练模型
            logistic.buildClassifier(data);

            // 用训练集进行评估
            Evaluation eval = new Evaluation(data);
            eval.evaluateModel(logistic, data);

            // 输出模型概况
            System.out.println("=== Model Summary ===");
            System.out.println(logistic);

            // 输出评估结果
            System.out.println("\n=== Evaluation Results ===");
            System.out.println(eval.toSummaryString());

            // 对新样本进行预测
            double[] values = new double[data.numAttributes()];
            // 设置特征值
            values[0] = 5.1;  // 例如，鸢尾花的花萼长度
            values[1] = 3.5;  // 鸢尾花的花萼宽度
            values[2] = 1.4;  // 鸢尾花的花瓣长度
            values[3] = 0.2;  // 鸢尾花的花瓣宽度

            // 创建一个新的实例
            Instances newInstance = new Instances(data, 1, values.length);
            newInstance.setClassIndex(newInstance.numAttributes() - 1);

            // 进行预测
            double prediction = logistic.classifyInstance(newInstance.firstInstance());
            System.out.println("\n=== Prediction ===");
            System.out.println("Predicted class: " + data.classAttribute().value((int) prediction));

        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
